package com.zn.opit.miniodemo.service;

import com.zn.opit.miniodemo.domain.minio.MinioUploadInfo;
import io.minio.ObjectWriteResponse;
import io.minio.messages.Bucket;
import org.springframework.http.ResponseEntity;
import org.springframework.web.multipart.MultipartFile;

import javax.servlet.http.HttpServletResponse;
import java.util.List;
import java.util.Optional;

public interface MinioService {

    /**
     * 上传本地文件
     *
     * @param bucketName 存储桶
     * @param fileName   对象名称
     * @param filePath   本地文件路径
     * @return ObjectWriteResponse
     */
    ObjectWriteResponse localUpload(String bucketName,
                                    String fileName,
                                    String filePath);

    /**
     * 文件上传
     *
     * @param file 文件
     * @return 文件名称
     */
    String upload(MultipartFile file);

    /**
     * 预览
     *
     * @param fileName 文件名
     * @return url
     */
    String preview(String fileName);

    /**
     * 文件下载
     *
     * @param fileName 文件名称
     * @param res      response
     */
    ResponseEntity<byte[]> download(String fileName, HttpServletResponse res);

    /**
     * 删除文件
     *
     * @param bucketName: 桶名
     * @param fileName:   文件名
     */
    void deleteFile(String bucketName, String fileName);

    /**
     * 批量删除
     *
     * @param fileNames 文件名列表
     */
    void removeFiles(List<String> fileNames);

    /**
     * 批量删除
     *
     * @param bucketName 存储bucket名称
     * @param fileNames  文件名列表
     */
    void removeFiles(String bucketName, List<String> fileNames);

    /**
     * 获取全部bucket
     */
    List<Bucket> getAllBuckets();

    /**
     * 判断bucket是否存在，不存在则创建
     *
     * @param name bucket名称
     * @return true存在(或创建成功), false不存在即创建失败
     */
    boolean existBucket(String name);

    /**
     * 创建存储bucket
     *
     * @param bucketName 存储bucket名称
     * @return true创建成功 false创建失败
     */
    Boolean makeBucket(String bucketName);

    /**
     * 根据bucketName获取其相关信息
     *
     * @param bucketName 存储bucket名称
     * @return bucket相关信息
     */
    Optional<Bucket> getBucket(String bucketName);

    /**
     * 移除存储bucket
     *
     * @param bucketName 存储bucket名称
     * @return true移除成功 false移除失败
     */
    Boolean removeBucket(String bucketName);

    /**
     * 初始化获取 uploadId
     *
     * @param objectName  文件名
     * @param partCount   分片总数
     * @param contentType contentType
     * @return uploadInfo
     */
    MinioUploadInfo initMultiPartUpload(String objectName,
                                        int partCount,
                                        String contentType);

    /**
     * 分片合并
     *
     * @param objectName 文件名
     * @param uploadId   uploadId
     * @return region
     */
    String mergeMultiPartUpload(String objectName, String uploadId);

    /**
     * 获取已上传的分片列表
     *
     * @param objectName 文件名
     * @param uploadId   uploadId
     * @return 分片列表
     */
    List<Integer> listUploadChunkList(String objectName, String uploadId);
}
